package com.munhrasoft.dinamica.business.entities;

import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@NamedQueries(value = {
    @NamedQuery(name = "findAllProcess", query = "SELECT p FROM Processo p"),
    @NamedQuery(name = "findByCliente", query = "SELECT p FROM Processo p WHERE p.cliente = :cliente"),
    @NamedQuery(name = "findByProcessId", query = "SELECT p FROM Processo p WHERE p.processo_id = :id"),
    @NamedQuery(name = "findByProcessTitulo", query = "SELECT p FROM Processo p WHERE p.tituloProcesso = :titulo") })
@SequenceGenerator(name = "processoSeq", initialValue = 1, allocationSize = 1)
public class Processo {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "processoSeq")
    private Long                    processo_id;
    private Cliente                 cliente;
    private Vendedor                vendedor;
    private Corretor                corretor;
    //private CheckListHeader         chkheader;
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private ProcessoChkHeader       pchkheader;
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
    private Imovel                  imovel;
    private Procurador              procuradorCliente;
    private Procurador              procuradorVendedor;
    private ProcessoStatus          status;
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<ProcessoAcompanha> acompanhaLines;
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<ProcessoCheckList> processoChkLine;
    private String                  observacoes;
    private String                  tituloProcesso;     // construido da seguinte maneira
                                                        // tituloProcesso = Processo +
                                                        // processo_id
    private boolean                 primeiroImovel;
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Custo                   custo;
    @Temporal(TemporalType.DATE)
    private Date                    dataCriacao;
    @Temporal(TemporalType.DATE)
    private Date                    dataStualizacao;
    @Temporal(TemporalType.DATE)
    private Date                    dataFinalizacao;

    @Override
    public boolean equals(Object obj) {
        if (this.getProcesso_id() == ((Processo) obj).getProcesso_id()) {
            return true;
        } else {
            return false;
        }
    }

    public Long getProcesso_id() {
        return processo_id;
    }

    public void setProcesso_id(Long processo_id) {
        this.processo_id = processo_id;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public Vendedor getVendedor() {
        return vendedor;
    }

    public void setVendedor(Vendedor vendedor) {
        this.vendedor = vendedor;
    }

    public Corretor getCorretor() {
        return corretor;
    }

    public void setCorretor(Corretor corretor) {
        this.corretor = corretor;
    }
/*
    public CheckListHeader getChkheader() {
        return chkheader;
    }

    public void setChkheader(CheckListHeader chkheader) {
        this.chkheader = chkheader;
    }
*/
    public ProcessoStatus getStatus() {
        return status;
    }

    public void setStatus(ProcessoStatus status) {
        this.status = status;
    }

    public List<ProcessoAcompanha> getAcompanhaLines() {
        return acompanhaLines;
    }

    public void setAcompanhaLines(List<ProcessoAcompanha> acompanhaLines) {
        this.acompanhaLines = acompanhaLines;
    }

    public List<ProcessoCheckList> getProcessoChkLine() {
        return processoChkLine;
    }

    public void setProcessoChkLine(List<ProcessoCheckList> processoChkLine) {
        this.processoChkLine = processoChkLine;
    }

    public Date getDataCriacao() {
        return dataCriacao;
    }

    public void setDataCriacao(Date dataCriacao) {
        this.dataCriacao = dataCriacao;
    }

    public Date getDataStualizacao() {
        return dataStualizacao;
    }

    public void setDataStualizacao(Date dataStualizacao) {
        this.dataStualizacao = dataStualizacao;
    }

    public Date getDataFinalizacao() {
        return dataFinalizacao;
    }

    public void setDataFinalizacao(Date dataFinalizacao) {
        this.dataFinalizacao = dataFinalizacao;
    }

    public String getObservacoes() {
        return observacoes;
    }

    public void setObservacoes(String observacoes) {
        this.observacoes = observacoes;
    }

    public boolean isPrimeiroImovel() {
        return primeiroImovel;
    }

    public void setPrimeiroImovel(boolean primeiroImovel) {
        this.primeiroImovel = primeiroImovel;
    }

    public Custo getCusto() {
        return custo;
    }

    public void setCusto(Custo custo) {
        this.custo = custo;
    }

    public Imovel getImovel() {
        return imovel;
    }

    public void setImovel(Imovel imovel) {
        this.imovel = imovel;
    }

    public String getTituloProcesso() {
        return tituloProcesso;
    }

    public void setTituloProcesso(String tituloProcesso) {
        this.tituloProcesso = tituloProcesso;
    }

    public Procurador getProcuradorCliente() {
        return procuradorCliente;
    }

    public void setProcuradorCliente(Procurador procuradorCliente) {
        this.procuradorCliente = procuradorCliente;
    }

    public Procurador getProcuradorVendedor() {
        return procuradorVendedor;
    }

    public void setProcuradorVendedor(Procurador procuradorVendedor) {
        this.procuradorVendedor = procuradorVendedor;
    }

    public ProcessoChkHeader getPchkheader() {
        return pchkheader;
    }

    public void setPchkheader(ProcessoChkHeader pchkheader) {
        this.pchkheader = pchkheader;
    }

}
